模式定义

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。

模式结构

工厂方法模式包含以下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

相对于简单工厂模式的优点

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做,这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引入新产品。

代码

  • Product接口

    1
    2
    3
    public interface Product {
    void name();
    }
  • BMW

    1
    2
    3
    4
    5
    6
    public class BMW implements Product {
    @Override
    public void name() {
    System.out.println("bmw...");
    }
    }
  • Audi

    1
    2
    3
    4
    5
    6
    public class Audi implements Product {
    @Override
    public void name() {
    System.out.println("audi...");
    }
    }
  • Factory接口

    1
    2
    3
    public interface Factory {
    Product create();
    }
  • BMWFactory

    1
    2
    3
    4
    5
    6
    public class BMWFactory implements Factory {
    @Override
    public Product create() {
    return new BMW();
    }
    }
  • AudiFactory

    1
    2
    3
    4
    5
    6
    public class AudiFactory implements Factory {
    @Override
    public Product create() {
    return new Audi();
    }
    }
  • Test

    1
    2
    3
    4
    5
    6
    7
    public class Test {
    public static void main(String[] args) {
    Factory factory = new AudiFactory();
    Product product = factory.create();
    product.name();
    }
    }

总结

  • 工厂方法模式包含四个角色:
    • 抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类,即产品对象的共同父类或接口
    • 具体产品实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们之间往往是一一对应
    • 抽象工厂中声明了工厂方法,用于返回一个产品,它是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现该接口
    • 具体工厂是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例
  • 工厂方法模式允许系统在不修改工厂角色的情况下引进新产品
  • 工厂方法模式的缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加
  • 本文转自2.工厂方法模式